#ifndef PROTECTION_H
#define PROTECTION_H

#include <QString>
#include <QByteArray>
#include <QCryptographicHash>
#include <QCoreApplication>
#include <QFile>
#include <QFileInfo>
#include <QProcess>
#include <QThread>
#include <QElapsedTimer>
#include <QRandomGenerator>

#ifdef _WIN32
#include <windows.h>
#include <debugapi.h>
#include <processthreadsapi.h>
#elif __APPLE__
#include <sys/sysctl.h>
#include <unistd.h>
#elif __linux__
#include <sys/ptrace.h>
#include <unistd.h>
#include <signal.h>
#endif

/**
 * @brief 安全保护类
 *
 * 提供多层安全保护机制：
 * - 反调试检测：检测是否在调试环境中运行
 * - 完整性检查：验证应用程序文件完整性
 * - 数据加密：认证数据的加密和解密
 * - 控制流混淆：保护关键逻辑不被分析
 */
class Protection
{
public:
    // 反调试检查
    static bool performAntiDebugCheck();
    static bool isDebuggerPresent();
    static bool checkRemoteDebugger();
    static bool checkDebuggerByTiming();
    static bool checkDebuggerByException();

    // 完整性检查
    static bool performIntegrityCheck();
    static void setIntegrityHash(const QByteArray& hash);
    static QByteArray calculateFileHash(const QString& filePath);

    // 数据加密/解密
    static QByteArray encryptAuthData(const QByteArray& data);
    static QByteArray decryptAuthData(const QByteArray& encrypted);

    // 字符串混淆
    static QString obfuscateString(const QString& str);
    static QString deobfuscateString(const QString& obfuscated);

    // 机器ID生成
    static QString machineID();
    static QString machineIDHashKey();

private:
    // 加密密钥生成
    static QByteArray generateKey();
    static QByteArray xorEncrypt(const QByteArray& data, const QByteArray& key);

    // 完整性哈希值（静态存储）
    static QByteArray s_integrityHash;

    // 内部检测方法
    static bool isRunningUnderDebugger();
    static bool hasDebuggerAttached();

    // 随机延迟（防止时序攻击）
    static void randomDelay();
};

// 安全保护宏定义
#define ANTI_DEBUG_CHECK() Protection::performAntiDebugCheck()
#define INTEGRITY_CHECK() Protection::performIntegrityCheck()

// 字符串混淆宏
#define OBFUSCATE_STR(str) Protection::obfuscateString(QString(str))

// 控制流混淆宏
#define OBFUSCATE_FLOW(condition, true_block, false_block) \
    do { \
        bool _cond = (condition); \
        volatile int _dummy = 0; \
        for (int _i = 0; _i < 100; ++_i) { \
            _dummy += _i * 2; \
        } \
        if (_dummy % 2 == 0) { \
            _cond = !_cond; \
        } \
        if (_cond) { \
            true_block; \
        } else { \
            false_block; \
        } \
    } while(0)

#endif // PROTECTION_H